package com.bear.newsset.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

import com.bear.newsset.adapter.ViewPagerAdapter;

import java.util.List;

/**
 * 新闻页面
 *
 * 设置页面数据列表
 * 内部实现了 {@link #setAdapter(PagerAdapter)}
 * @see #setData(List)
 *
 * 设置页面改变适配器
 * 当页面发生改变时（滑动）触发
 * @see #setOnPageChangeAdapter(OnPageChangeAdapter)
 */
public class NewsViewPager extends ViewPager {
    public interface OnPageChangeListener {
        void onPageSelected(View v, int i);
    }

    private List<View> mPagerList;
    @Nullable
    private ViewPagerAdapter mAdapter = null;
    private OnPageChangeAdapter mOnPageChangeAdapter;

    public NewsViewPager(@NonNull Context context) {
        super(context);
        init();
    }

    public NewsViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    /**
     * 初始化
     */
    private void init() {
        initListener();
    }

    /**
     * 初始化监听器
     */
    private void initListener() {
        //页面改变事件监听器
        addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) { }
            @Override
            public void onPageSelected(int i) {
                if( mPagerList == null || mPagerList.size() < i || mOnPageChangeAdapter == null ) {
                    return;
                }
                //回调选中的View和下标
                mOnPageChangeAdapter.onPageSelected(mPagerList.get( i ), i);
            }
            @Override
            public void onPageScrollStateChanged(int i) { }
        });
    }

    /**
     * 设置数据推荐使用 {@link #setData(List)}
     * @param adapter   适配器
     */
    @Deprecated
    @Override
    public void setAdapter(@Nullable PagerAdapter adapter) {
        super.setAdapter(adapter);
    }

    /**
     * 获取适配器
     * @return  适配器
     */
    @Nullable
    public ViewPagerAdapter getAdapter() {
        return mAdapter;
    }

    /**
     * 设置数据 数据通过 {@link #setAdapter(PagerAdapter)} 进行设置
     * @param viewList  数据列表
     */
    public void setData(@NonNull List<View> viewList) {
        mAdapter = new ViewPagerAdapter<>( (mPagerList = viewList) );
        setAdapter( mAdapter );
    }

    /**
     * 设置页面改变事件监听器
     * @param mOnPageChangeAdapter     回调适配器
     */
    public void setOnPageChangeAdapter(OnPageChangeAdapter mOnPageChangeAdapter) {
        this.mOnPageChangeAdapter = mOnPageChangeAdapter;
    }

    /**
     * 页面改变事件适配器
     */
    public static class OnPageChangeAdapter implements OnPageChangeListener {
        @Override
        public void onPageSelected(View v, int i) { }
    }
}